home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / ms_dos / thbfc / thpo.c < prev    next >
C/C++ Source or Header  |  1993-11-30  |  4KB  |  219 lines

  1.  
  2. /*
  3.     THpo下級印字UTY
  4.  
  5.         By 五味(93/04/21~93/04/22)
  6.  
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <jctype.h>
  12.  
  13. #define    TRUE    1
  14. #define    FALSE    0
  15.  
  16. #define    BUFMAX    4096
  17.  
  18.     int    f=TRUE;        /* 行のフラッシュフラグ    */
  19.     int    isANK=TRUE;    /* ANKモードか否か    */
  20.     char    tbuf[BUFMAX];    /* テンポラリバッファ    */
  21.  
  22.     int    PRN_put(char);
  23.     char    keyin(void);
  24.  
  25.  
  26. void waiter(void)
  27. {
  28.     char    k;
  29.  
  30.     while( (k=keyin())==0 );
  31.     if( k==0x1b ){
  32.         printf(" 中断しました.\n");
  33.         exit(0);
  34.     }
  35. }
  36.  
  37. void PRN_putc(char c)
  38. {
  39.     int    i;
  40.  
  41.     while( (i=PRN_put(c)) ){
  42.         switch(i){
  43.         case 2:
  44.         case 3:
  45.             printf(" error: プログラミングエラー.\n");
  46.             exit(2);
  47.         case 4:
  48.             printf(" 用紙切れです.\n");
  49.             waiter();
  50.             break;
  51.         case 5:
  52.             printf(" オフラインです.\n");
  53.             waiter();
  54.             break;
  55.         case 0x80:
  56.             printf(" fatal: プリンタの動作エラーです.");
  57.             exit(2);
  58.         default:
  59.             printf(" BIOSエラー.\n");
  60.             exit(2);
  61.         }
  62.     }
  63. }
  64.  
  65. void PRN_flash(void)        /* 行印字のフラッシュ    */
  66. {
  67.     if( f==FALSE ) {
  68.         PRN_putc(0x0a);
  69.         PRN_putc(0x0d);    /* 吐き出し    */
  70.     }
  71.     f=TRUE;
  72. }
  73.  
  74. void PRN_ank(void)
  75. {
  76.     PRN_putc(0x1b);
  77.     PRN_putc('(');
  78.     PRN_putc('H');
  79.     isANK=TRUE;
  80. }
  81.  
  82. void PRN_kan(void)
  83. {
  84.     PRN_putc(0x1b);
  85.     PRN_putc('$');
  86.     PRN_putc('B');
  87.     isANK=FALSE;
  88. }
  89.  
  90. void PRN_puts(char *str)
  91. {
  92.     unsigned short    c;
  93.     unsigned char    *p;
  94.  
  95.     for(p=(unsigned char *)str;*p!=0;){
  96.         if( iskanji(*p) ) {
  97.             if( isANK ) PRN_kan();
  98.             c=jmstojis((*p<<8)+(*(p+1))); p+=2;
  99.             PRN_putc(c >> 8);
  100.             PRN_putc(c&0xff);
  101.         }else{
  102.             if( !isANK )PRN_ank();
  103.             PRN_putc(*(p++));
  104.         }
  105.     }
  106. }
  107.  
  108. void settab(int p)
  109. {
  110.     int    t;
  111.  
  112.     if( p>=10000 ){    PRN_putc(0x20+(t=p/10000));p-=t*10000;    }
  113.     if( p>=1000  ){    PRN_putc(0x20+(t=p/1000 ));p-=t*1000;    }
  114.     if( p>=100   ){    PRN_putc(0x20+(t=p/100  ));p-=t*100;    }
  115.     if( p>=10    ){    PRN_putc(0x20+(t=p/10   ));p-=t*10;    }
  116.             PRN_putc(0x60+(p      ));
  117. }
  118.  
  119. void PRN_init(void)
  120. {
  121.     int    i,p,t;
  122.  
  123.     PRN_ank();
  124.  
  125.     PRN_putc(0x1c);
  126.     PRN_putc('#');
  127.     for( i=0 ; i<32-1 ; i++ )settab(i*24*4);
  128.     p=31*24*4;
  129.     if( p>=10000 ){    PRN_putc(0x20+(t=p/10000));p-=t*10000;    }
  130.     if( p>=1000  ){    PRN_putc(0x20+(t=p/1000 ));p-=t*1000;    }
  131.     if( p>=100   ){    PRN_putc(0x20+(t=p/100  ));p-=t*100;    }
  132.     if( p>=10    ){    PRN_putc(0x20+(t=p/10   ));p-=t*10;    }
  133.             PRN_putc(0x70+(p      ));
  134.  
  135.     PRN_putc(0x1c);
  136.     PRN_putc('$');
  137.     PRN_putc(0x22);
  138.     PRN_putc(0x74);
  139. }
  140.  
  141. void illopt(char *opt)        /* 違法なオプション    */
  142. {
  143.     printf("  illegal option '%s'.",opt);
  144.     exit(1);
  145. }
  146.  
  147. void fileprn(char *path)    /* ファイル印字        */
  148. {
  149.     FILE    *fp;
  150.  
  151.     PRN_flash();
  152.  
  153.     if( (fp=fopen(path,"r"))==0 ) {
  154.         printf(" '%s' not found.\n",path);
  155.         exit(1);
  156.     }
  157.  
  158.     while( fgets(tbuf,BUFMAX,fp) ) {
  159.         PRN_puts(tbuf);
  160.     }
  161.  
  162.     if( ferror(fp) ) {
  163.         printf(" read error.\n",path);
  164.         exit(2);
  165.     }
  166. }
  167.  
  168. int main(int argc,char *argv[])
  169. {
  170.     int    i;
  171.  
  172.     if( argc==1 ) {
  173.         printf(    "  \'THpo\' print uty  v1.1\n"
  174.             "  (c) H.Gomi  93/04/22\n"
  175.             "  [usage] THpo [-fFILENAME][-+o]<line>\n"    );
  176.         return 0;
  177.     }
  178.  
  179.     PRN_init();
  180.  
  181.     for( i=1 ; i<argc ; i++ ) {
  182.         if( *argv[i]=='+' )
  183.             switch(*(argv[i]+1)) {
  184.             case'o':
  185.                 PRN_putc(0x1c);
  186.                 PRN_putc('T');
  187.                 break;        /* 欧文処理開始    */
  188.             case'f':
  189.                 fileprn(argv[i]+2);
  190.                 break;        /* ファイル印字    */
  191.             default:
  192.                 illopt(argv[i]);
  193.             }
  194.         else if( *argv[i]=='-' )
  195.             switch(*(argv[i]+1)) {
  196.             case'o':
  197.                 PRN_putc(0x1c);
  198.                 PRN_putc('U');
  199.                 break;        /* 欧文処理終了    */
  200.             case'f':
  201.                 fileprn(argv[i]+2);
  202.                 break;        /* ファイル印字    */
  203.             default:
  204.                 illopt(argv[i]);
  205.             }
  206.         else{
  207.             f=FALSE;
  208.             PRN_puts(argv[i]);    /* 印字    */
  209.             PRN_ank();
  210.             PRN_putc(0x20);
  211.             if( isANK==FALSE )
  212.                 PRN_kan();
  213.         }
  214.     }
  215.  
  216.     PRN_flash();
  217.     return 0;
  218. }
  219.